package org.dei.perla.sys.device.adapter;

import org.dei.perla.utils.messages.Message;
import org.dei.perla.utils.pipe.Pipe;
import org.dei.perla.sys.device.channel.frame.address.FrameAddress;

/**
 * Classe che associa identificatore del canale virtuale (VCI), 
 * indirizzo fisico del dispositivo, FPC e canale.
 * È una tupla utilizzata dal Registro.
 * L'utilizzo del campo che identifica il canale si rende necessario 
 * nel caso in cui ci siano fonti eterogenee e di conseguenza diversi canali.
 *
 */
public class AdapterSrvEntry {
	
	/**
	 * Indirizzo dell'adapter Server nel channel manager, usato solo dal gateway
	 */
	private FrameAddress pAdapterAddress;
	
	/**
	 * Indirizzo del dispositivo
	 */
	private FrameAddress pDeviceAddress;
	
	/**
	 * Identificativo di canale virtuale di binding (Binding Virtual Channel Identifier)
	 */
	private int pBvci;
	
	/**
	 * Identificativo usato per sdoppiare richieste di binding uguali, usato solo dal gateway
	 */
	private int pRemappedBvci;
	
	/**
	 * Identificativo di canale virtuale (Virtual Channel Identifier)
	 */
	private int pVci;
	
	/**
	 * Pipe per la lettura da livello superiore
	 */
	private Pipe<Message> pUpperPipeIn;
	
	/**
	 * Pipe per la scrittura da livello superiore
	 */
	private Pipe<Message> pUpperPipeOut;

	/**
	 * Pipe per la lettura da livello inferiore
	 */
	private Pipe<Message> pLowerPipeIn;
	
	/**
	 * Pipe per la scrittura da livello inferiore
	 */
	private Pipe<Message> pLowerPipeOut;
	
	/**
	 * Costruttore
	 * 
	 * @param parBvci, identificatore di canale virtuale di binding
	 * @param parUpperPipeIn, pipe in lettura HL
	 * @param parUpperPipeOut, pipe in scrittura HL
	 * @param parLowerPipeIn, pipe in lettura LL
	 * @param parLowerPipeOut, pipe in scrittura LL
	 * @param parDeviceAdd, indirizzo del dispositivo
	 * @param parAdapterAddress, indirizzo dell'adapter nel channel manager
	 */
	public AdapterSrvEntry(int parBvci, 
			Pipe<Message> parUpperPipeIn, 
			  Pipe<Message> parUpperPipeOut, 
			   Pipe<Message> parLowerPipeIn, 
			  	Pipe<Message> parLowerPipeOut, 
			  	 FrameAddress parDeviceAdd,
			  	  FrameAddress parAdapterAddress){
		
		this.pBvci = parBvci;
		this.pVci = 0;
		this.pUpperPipeIn = parUpperPipeIn;
		this.pUpperPipeOut = parUpperPipeOut;
		this.pDeviceAddress = parDeviceAdd;
		this.pLowerPipeIn = parLowerPipeIn;
		this.pLowerPipeOut = parLowerPipeOut;
		this.pAdapterAddress = parAdapterAddress;
	}
	
	/**
	 * Costruttore
	 * 
	 * @param parBvci, identificatore di canale virtuale di binding
	 * @param parUpperPipeIn, pipe in lettura HL
	 * @param parUpperPipeOut, pipe in scrittura HL
	 * @param parLowerPipeIn, pipe in lettura LL
	 * @param parLowerPipeOut, pipe in scrittura LL
	 * @param parDeviceAdd, indirizzo del dispositivo
	 */
	public AdapterSrvEntry(int parBvci, 
			Pipe<Message> parUpperPipeIn, 
			  Pipe<Message> parUpperPipeOut, 
			   Pipe<Message> parLowerPipeIn, 
			  	Pipe<Message> parLowerPipeOut, 
			  	 FrameAddress parDeviceAdd){
		
		this.pBvci = parBvci;
		this.pVci = 0;
		this.pUpperPipeIn = parUpperPipeIn;
		this.pUpperPipeOut = parUpperPipeOut;
		this.pDeviceAddress = parDeviceAdd;
		this.pLowerPipeIn = parLowerPipeIn;
		this.pLowerPipeOut = parLowerPipeOut;
		this.pAdapterAddress = null;
	}

	
	/*
	 * Vari metodi getter e setter
	 */

	public int getBvci() {
		return pBvci;
	}

	public void setBvci(int bvci) {
		this.pBvci = bvci;
	}

	public FrameAddress getDeviceAddress() {
		return pDeviceAddress;
	}


	public void setDeviceAddress(FrameAddress deviceAddress) {
		pDeviceAddress = deviceAddress;
	}


	public Pipe<Message> getLowerPipeIn() {
		return pLowerPipeIn;
	}


	public void setLowerPipeIn(Pipe<Message> lowerPipeIn) {
		pLowerPipeIn = lowerPipeIn;
	}


	public Pipe<Message> getLowerPipeOut() {
		return pLowerPipeOut;
	}


	public void setLowerPipeOut(Pipe<Message> lowerPipeOut) {
		pLowerPipeOut = lowerPipeOut;
	}


	public int getRemappedBvci() {
		return pRemappedBvci;
	}


	public void setRemappedBvci(int remappedBvci) {
		pRemappedBvci = remappedBvci;
	}


	public Pipe<Message> getUpperPipeIn() {
		return pUpperPipeIn;
	}


	public void setUpperPipeIn(Pipe<Message> upperPipeIn) {
		pUpperPipeIn = upperPipeIn;
	}


	public Pipe<Message> getUpperPipeOut() {
		return pUpperPipeOut;
	}


	public void setUpperPipeOut(Pipe<Message> upperPipeOut) {
		pUpperPipeOut = upperPipeOut;
	}


	public int getVci() {
		return pVci;
	}

	public void setVci(int vci) {
		this.pVci = vci;
	}


	public FrameAddress getAdapterAddress() {
		return pAdapterAddress;
	}


	public void setAdapterAddress(FrameAddress adapterAddress) {
		pAdapterAddress = adapterAddress;
	}
	
}